//题目:
// 给你一个二叉树的根节点 root ，判断其是否是一个有效的二叉搜索树。
// 有效 二叉搜索树定义如下：
// 节点的左子树只包含 小于 当前节点的数。
// 节点的右子树只包含 大于 当前节点的数。
// 所有左子树和右子树自身必须也是二叉搜索树。
#include<iostream>

using namespace std;
//代码:
struct TreeNode 
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution 
{
public:
    //法一:
    // void cursion(TreeNode* root,vector<int>& vv)
    // {
    //     if(root==nullptr)return;
    //     cursion(root->left,vv);//左子树
    //     vv.push_back(root->val);//根
    //     cursion(root->right,vv);//右子树
    // }

    bool is_max(TreeNode* root,int val)
    {
        //如果root中存在>=val的结点，则返回true，否则返回false
        if(root->val>=val)return true;

        bool ret=false;
        if(root->left)ret|=is_max(root->left,val);
        if(root->right)ret|=is_max(root->right,val);

        return ret;
    }
    bool is_min(TreeNode* root,int val)
    {
        //如果root中存在<=val的结点，则返回true，否则返回false
        if(root->val<=val)return true;

        bool ret=false;
        if(root->left)ret|=is_min(root->left,val);
        if(root->right)ret|=is_min(root->right,val);

        return ret;
    }
    bool isValidBST(TreeNode* root) 
    {
        //法一:
        // vector<int> vv;
        // cursion(root,vv);
        // //判断vv是否为升序
        // for(int i=0;i<vv.size()-1;i++)
        //     if(vv[i]>=vv[i+1])return false;
        // return true;

        //法二:
        if(root==nullptr)return true;

        if(root->left && is_max(root->left,root->val))return false;//找到左子树的最大值
        if(root->right && is_min(root->right,root->val))return false;//找到右子树的最小值

        return isValidBST(root->left) && isValidBST(root->right);
    }
};